package com.cancan.cloud.shop.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.JSONLibDataFormatSerializer;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.util.List;
import java.util.Map;

/**
 * @program: JsonUtils
 * @author: zzx
 * @date: Create in 15:08 2020/1/14
 * @description: JSON工具类使用fastJSON
 * @version: 1.0.0
 */
public final class JsonUtils {


    private static final SerializeConfig CONFIG;

    static {
        CONFIG = new SerializeConfig();
        // 使用和json-lib兼容的日期输出格式
        CONFIG.put(java.util.Date.class, new JSONLibDataFormatSerializer());
        // 使用和json-lib兼容的日期输出格式
        CONFIG.put(java.sql.Date.class, new JSONLibDataFormatSerializer());
    }

    private static final SerializerFeature[] FEATURE = {
            // 输出空置字段
            SerializerFeature.WriteMapNullValue,
            // list字段如果为null，输出为[]，而不是null
            SerializerFeature.WriteNullListAsEmpty,
            // 数值字段如果为null，输出为0，而不是null
            SerializerFeature.WriteNullNumberAsZero,
            // Boolean字段如果为null，输出为false，而不是null
            SerializerFeature.WriteNullBooleanAsFalse,
            // 字符类型字段如果为null，输出为""，而不是null
            SerializerFeature.WriteNullStringAsEmpty
    };

    /**
     * 类对象转Json字符串，对于空list string等进行转换的方法（null>[] 、 "")
     * @param obj 需要转换的对象
     * @return 返回json字符串
     */
    public static String obj2JsonWithFeature(Object obj) {
        return JSON.toJSONString(obj, CONFIG, FEATURE);
    }

    /**
     * 类对象转Json字符串，不空list string等进行转换的方法
     * @param obj 需要转换的对象
     * @return 返回json字符串
     */
    public static String obj2Json(Object obj) {
        return JSON.toJSONString(obj, CONFIG);
    }

    /**
     * Json字符串转换成类对象，返回<code>Object</code>类型对象
     * @param jsonStr 输入的Json字符串
     * @return 返回Object类
     */
    public static Object json2Obj(String jsonStr) {
        return JSON.parse(jsonStr);
    }

    /**
     * Json字符串转换成类对象，返回指定类型对象
     * @param jsonStr 输入的Json字符串
     * @param clazz 类名
     * @param <T> 返回类型
     * @return 返回指定类型对象
     */
    public static <T> T json2Obj(String jsonStr, Class<T> clazz) {
        return JSON.parseObject(jsonStr, clazz);
    }

    /**
     * Json字符串转<code>Map</code>,可以对key和value制定类
     * @param jsonStr Json字符串

     * @return 返回Map<K, V> K key返回类的类型 V value返回类的类型
     */
    public static <K, V> Map<K, V> json2Map(String jsonStr){
        return JSON.parseObject(jsonStr, new TypeReference<Map<K, V>>(){});
    }

    /**
     * 将<code>Map</code>转化为json字符串
     * @param m 输入的map
     * @return 返回Json字符串
     */
    public static <K, V> String map2String(Map<K, V> m) {
        return JSONObject.toJSONString(m);
    }

    /**
     * 将<code>List</code>转换为json字符串
     * @param l 需要转换的list
     * @return 转换后的json字符串
     */
    public static String list2String(List l) {
        return JSON.toJSON(l).toString();
    }

    /**
     *  转换为数组，返回为<code>List<Object></code>，需要自行转换格式
     * @param jsonArr json数组字符串
     * @return 列表List<Object>
     */
    public static List<Object> json2List(String jsonArr) {
        return json2List(jsonArr, Object.class);
    }

    /**
     *  转换为数组，返回指定泛型的<code>List<T></code>
     * @param jsonArr json数组字符串
     * @param clazz 对象泛型
     * @return 列表List<T>
     */
    public static <T> List<T> json2List(String jsonArr, Class<T> clazz) {
        return JSON.parseArray(jsonArr, clazz);
    }

}
